lvs基础（1）
==================================================
lvs： Linux Virtual Server
创始人：章文嵩

工作方式：
    四层路由、四层交换：根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机。


iptables：
    iptables/netfilter
        PREROUTING --> INPUT
        PREROUTING --> FORWARD --> POSTROUTING
        OUTPUT --> POSTROUTING  


lvs:
    ipvsadm/ipvs 
        ipvsadm：用户空间的命令行工具，用于管理集群服务及集群服务上的RS；
        ipvs：工作于内核上的netfilter的INPUT钩子之上的程序，可根据用户定义的集群实现请求转发；

        支持基于TCP、UDP、SCTP、AH、EST、AH_EST等协议进行调度；


lvs集群的专用术语：
    vs：Virtual Server, Director, Dispatcher, Balancer
    rs：Real Server
    
    CIP: Client IP：用户端的ip
    VIP: Virtual Server IP：用户访问服务器的ip
    DIP：Director IP：调度器IP
    RIP：Real Server IP：提供服务的服务IP


lvs集群的类型：（lvs-nat，lvs-dr，lvs-tun，lvs-fullnat）
    （1）lvs-nat：
        多目标的DNAT，通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发；
        1：RIP和DIP必须在同一IP网络，且应该使用私有地址；RS的网络要指向DIP（保证响应报文必须经由VS）；
        2：请求报文和响应报文都经由Director转发，较高负载下，Director易于成为系统性能瓶颈；
        3：支持端口映射；
        4：VS必须是Linux，RS可以是任意OS；

    （2）lvs-dr：Direct Routing
        通过为请求报文的重新封闭一个MAC首部进行转发，源MAC是DIP所在接口的MAC，目标MAC是挑选出某RS的RIP所在接口的MAC地址；IP首部不会发生变化（CIP<-->VIP）；
            1：确保前端路径器将目标IP为VIP的请求报文发往Director:
            解决方案：
                在路由器上静态绑定VIP和Director的MAC地址；
                禁止RS响应VIP的ARP请求，禁止RS的VIP进行通告
                    (a) arptables
                    (b) 修改RS的内核参数，并把VIP绑定lo的别名上；
                        arp_ignore, arp_announce
            2：RS的RIP可以使用私有地址，也可以使用公网地址；
            3：RS跟Director必须在同一物理网络；RS的网关必须不能指向DIP；
            4：请求报文必须由Directory调度，但响应报文必须不能经由Director；
            5：不支持端口映射；
            6：RS可以使用大多的OS；
        
    （3）lvs-tun：tunnel
        转发方式：不修改请求报文的IP首部（源IP为CIP，目标IP为VIP），而是原IP首部之外再封装一个IP首部（源IP为DIP，目标IP为挑选出的RS的RIP）；
            1：RIP，DIP，VIP全得是公网地址；
            2：RS网关不能指向也可能指向DIP；
            3：请求报文经由Director转发，但响应报文将直接发往CIP；
            4：不支持端口映射；
            5：RS的OS必须支持隧道功能；
        
    （4）lvs-fullnat：
        通过同时修改请求报文的源IP地址（CIP-->DIP）和目标IP地址（VIP-->RIP）进行转发；
            1：VIP是公网地址，RIP和DIP是私网地址，且通常不在同一网络中，但需要经由路由器互通；
            2：RS收到的请求报文源IP为DIP，因此响应报文将直接响应给DIP；
            3：请求和响应报文都经由Director；
            4：支持端口映射；


负载均衡集群中会话保持的方式：
    （1）源地址哈希；把来自同一ip的发到特定服务器
    （2）会话集群；每台服务器都存储一份完整的session。
    （3）会话服务器；一台服务器专门存储session。做高可用集群。


lvs调度器（lvs scheduler）：根据其调度时是否考虑后端主机的当前负载，可分为静态方法和动态方法两类
    （1）静态方法：仅根据算法本身进行调度
        RR：Round Robin，轮询/轮调/轮叫
        WRR：Weighted RR，加权轮询
        SH：Source Hashing，源地址哈希
        DH：Destination Hashing，目标地址哈希；正向web代理（缓存），负载均衡内网用户对外部服务器的请求

    （2）动态方法：根据算法及各RS当前的负载状态进行调度；
            Overhead：权重值
            1：LC: least connections，最少连接；
                Overhead=Active*256+Inactive  
            2：WLC: Weighted LC, 加权最少连接；
                Overhead=(Active*256+Inactive)/weight 
            3：SED：Shortest Expections Delay
                Overhead=(Active+1)*256/weight
            4：NQ：Never Queue
            5：LBLC：Locality-Based LC
                动态的DH算法
            6：LBLCR：LBLC with Replication
                带复制功能的LBLC



==================================================

lvs FWM及持久连接(03)

    fwm: FireWall Mark
        
        在netfilter上给报文打标记；mangle表；
            打标记的方法：
                iptables  -t mangle  -A PREROUTING -d $vip  -p $protocol --dport  $csport  -j MARK  --set-mark  #
                    #：整数；
                    
    lvs persistence：持久连接
    
        基于持久连接模板，能实现无使用任何算法调度，都能进行在一段时间内，将来自于同一源IP的请求始终发往同一RS；
        
        ipvs的持久类型：
            每端口持久（PPC）：
            每客户端持久（PCC）：
            每FWM持久：
                    
        定义持久连接服务的方法：
            ipvsadm -A|E -t|u|f service-address [-s scheduler]  -p [timeout]
            
            示例：
                # iptables -t mangle -A PREROUTING -d 172.18.100.7 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
                # ipvsadm -A -f 10 -s rr -p
                # ipvsadm -a -f 10 -r 172.18.100.11 -g -w 1
                # ipvsadm -a -f 10 -r 172.18.100.12 -g -w 1
                
    考虑：
        (1) Director不可用时：整个系统不可用；SPOF；
        (2) 某RS不可用时，Director是否仍会向其调度请求；
            对RS作健康状态检测，并按需增删；
                (a) 网络层探测；
                (b) 传输层探测；
                    端口可用性探测；
                (c) 应用层探测；





~]# iptables -t mangle -A PREROUTING -d 172.18.21.71 -p tcp --dport 80 -j MARK --set-mark 1
oot@localhost ~]# iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 109 packets, 16738 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            172.18.21.71         tcp dpt:80 MARK set 0x1

Chain INPUT (policy ACCEPT 109 packets, 16738 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 27 packets, 2428 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 27 packets, 2428 bytes)
 pkts bytes target    




 [root@localhost ~]# ipvsadm -A -f 1 -s rr
[root@localhost ~]# ipvsadm -a -f 1 -r 172.18.21.72 -g -w 1
[root@localhost ~]# ipvsadm -a -f 1 -r 172.18.21.73 -g -w 1
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  1 rr
  -> 172.18.21.72:0               Route   1      0          0         
  -> 172.18.21.73:0               Route   1      0          0         
[root@localhost ~]# 

[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS2<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS2<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS2<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS2<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS2<h1>
[root@localhost ~]# curl 172.18.21.71
<h1>RS1<h1>
[root@localhost ~]# 




[root@localhost ~]# ipvsadm -E -f 1 -s rr -p 10
[root@localhost ~]# ipvsadm -nL
Try `ipvsadm -h' or 'ipvsadm --help' for more information.
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  1 rr persistent 10
  -> 172.18.21.72:0               Route   1      0          0         
  -> 172.18.21.73:0               Route   1      0          0         



每端口持久：
[root@localhost ~]# iptables -t mangle -F
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -A -t 172.18.21.71:0 -s rr -p
[root@localhost ~]# ipvsadm -a -t 172.18.21.71:0 -r 172.18.21.72 -g -w 1
[root@localhost ~]# ipvsadm -a -t 172.18.21.71:0 -r 172.18.21.73 -g -w 1



















~]# openssl rand -base64 10
wYIWAFz9a3

生成页面hash码：
/usr/bin/genhash

